﻿/**
 * 核心模块
 * 实现数据处理相关方法
 */
(function(E, $){

var Consts = E.consts;

E.mod("Utils", {
	filter65279:function(text){
		var s=String.fromCharCode(65279), re=new RegExp(s, "g");
		while(text.indexOf(s)>-1){
			text=text.replace(re, '');
		}
		return text;
	},
	
	/**
	 * html特殊字符转义为html实体字符串
	 * @param {String} html
	 * @returns {String}
	 */
	escape: function(html) {
		if(!html || typeof html !== 'string'){return html}
		return html.replace(/&/g, "&amp;")
			.replace(/</g, "&lt;")
			.replace(/>/g, "&gt;")
			.replace(/"/g, "&quot;")
			.replace(/ /g, "&nbsp;");
	},
	
	// 潘雪鹏 2011-07-16
	// escape 和 unhtml 两个方法功能是相同的，但是执行效率略有差异
	// 在 chrome firefox 下性能相差不多
	// 在IE下unhtml 明显慢于escape
	// 综合考虑还是优先使用 escape
	// 原因应该是ie在函数调用方面效率低一些
	
	/**
	 * html特殊字符转义为html实体字符串
	 * @param {String} html
	 * @returns {String}
	 */
	unhtml: function ( ) {
		var map = { '&': '&amp', '<': '&lt;', '"': '&quot;', '>': '&gt;', ' ': '&nbsp;' };
		function fn( m ){ return map[m] }
		
		return function ( html ) {
			if(!html || typeof html !== 'string'){ return html }
			return html.replace( /[&<"> ]/g, fn );
		};
	}(),
	
	/*
	* 检查双标签是否完整
	*/
	checkTag: function( html ){
		if(!html || typeof html !== 'string'){return html}
		var tip='', re=/<(\/?\w+)/ig, tags=[], arr, name;
		while((arr = re.exec(html)) != null){
			name=arr[1].toLowerCase();
			//忽略一些单标签
			// 潘雪鹏 2011-09-20
			// 同时忽略p标签，因为在ie下很容易导致p标签不匹配
			if(/^(img|br|hr|input|link|meta|param|embed|p|area|span)$/i.test(name)) continue;
			
			if(name.indexOf('/') == -1){
				tags.push(name);
			}else{
				if('/'+tags[tags.length-1] == name){
					tags.pop();
				}
			}
		}
		
		if(tags.length >6){
			tip ='提示：\n'+tags.length+'个标签 '+ tags.slice(0,6).join('-&gt;') +'... 未闭合，请检查。';
		}else if(tags.length){
			tip ='提示：\n标签 '+ tags.join('-&gt;') +' 未闭合，请检查。';
		}
		return tip;
	},
	
	strlen: function( str ){
		if(str && typeof str == "string"){
			return str.replace(/[^\x00-\xff]/g, "xx").length;
		}else{
			return 0;
		}
	},
	
	saveToInput: function(eid){
		eid = eid || E.eid;
		var textarea = E.options[eid]["textarea"];
		
		textarea.value = this.get(eid);
	},
	
	// 主要用来将一个document集合对象，转为一个数组
	clone: function( obj ){
		var arr = [];
		for (var i = 0, len = obj.length; i < len; i++){
			arr[i] = obj[i];
		}
		return arr;
	},
	
	colorToHex: function(color){
		var digits = /rgb\((\d+),(?: |&nbsp;)?(\d+),(?: |&nbsp;)?(\d+)\)/i.exec(color);
		
		var red = parseInt(digits[1]);
		var green = parseInt(digits[2]);
		var blue = parseInt(digits[3]);
		
		var rgb = blue | (green << 8) | (red << 16);
		return '#' + rgb.toString(16);
	},
	
	// 如果写入不完整的html片段，浏览器会自动尽量补全修正，
	// 尽管不一定十分合理，但是总比不补要强很多
	closeTag: function(html){
		var div = document.createElement('div');
		div.innerHTML = html;
		return div.innerHTML;
	}
});

})(jQEditor, jQuery);